/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Schedule.DataLayer;

import Utilities.*;
import DataModel.*;
import java.util.*;
import java.sql.ResultSet;
import java.text.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;

/**
 *
 * @author Rainiero
 */
public class ScheduleDataManager {

    // <editor-fold defaultstate="collapsed" desc="Singleton">
    private static ScheduleDataManager _instance = new ScheduleDataManager();

    private ScheduleDataManager()
    {
    }

    public static ScheduleDataManager GetInstance()
    {
        return _instance;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Public Methods">
    public void RegisterAdvance(int activityId, Date date, double advance, double spentBudget)
    {
        DataAccesor accesor = DataAccesor.GetInstance();
        String spName = "RegistrarAvance";
        SQLParameter[] parameters =
            {new SQLParameter("idActividad", activityId),
            new SQLParameter("porcentajeAvance", advance),
            new SQLParameter("montoGastado", spentBudget),
            new SQLParameter("fecha", date)};
        try
        {
            accesor.ExecuteOutputSP(spName, parameters);
        }
        catch(Exception ex)
        {
        }
    }

    public int GetLastSchedule(int projectId)
    {
        DataAccesor accesor = DataAccesor.GetInstance();
        String spName = "ObtenerIdCronogramaActual";
        SQLParameter[] parameters = { new SQLParameter("idProyecto",  projectId)};
        try
        {
            ResultSet reader = accesor.ExecuteInputSP(spName, parameters);
            int result = -1;
            if(reader.next())
                result = reader.getInt("IdCronograma");
            reader.close();
            return result;
        }
        catch(Exception ex)
        {
            return -1;
        }
    }

    private ActivitySummary buildActivity(Node actNode, String parentName) throws Exception
    {

/*"@IdActividadProyecto",  "@NombreActividadProyecto",
"@FechaInicio" "@FechaFinal" "@PresupuestoActualDolares",
 "@PorcentajeCompletitud", */

        NamedNodeMap attributes = actNode.getAttributes();
        int actId = Integer.parseInt(attributes.getNamedItem("IdActividadProyecto").getNodeValue());
        String name = attributes.getNamedItem("NombreActividadProyecto").getNodeValue();
        String startDateStr = attributes.getNamedItem("FechaInicio").getNodeValue();
        Date startDate = getDate(startDateStr);
        String endDateStr = attributes.getNamedItem("FechaFinal").getNodeValue();
        Date endDate = getDate(endDateStr);
        String str = attributes.getNamedItem("PresupuestoActualDolares").getNodeValue();
        double budget = Double.parseDouble(str);
        double completed = Double.parseDouble(attributes.getNamedItem("PorcentajeCompletitud").getNodeValue());
        ActivitySummary builtActivity = new ActivitySummary(actId, name, parentName, startDate, endDate, budget, completed);
        NodeList nodeList = actNode.getChildNodes();
        for(int xmlIndex = 0; xmlIndex < nodeList.getLength(); xmlIndex++)
            builtActivity.AddChild(buildActivity(nodeList.item(xmlIndex), name));
        return builtActivity;
    }

    private Date getDate(String str) throws Exception
    {
        DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        return formatter.parse(str);
    }

    public ActivitySummary[] GetSchedule(int scheduleId)
    {
        DataAccesor accesor = DataAccesor.GetInstance();
        String spName = "ObtenerCronograma";
        SQLParameter[] parameters = { new SQLParameter("IdCronograma",  scheduleId)};
        try
        {
            ResultSet result = accesor.ExecuteInputSP(spName, parameters);
            StringBuilder sb = new StringBuilder();
            while(result.next())
                sb.append(result.getString(1));
            result.close();
            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
            org.xml.sax.InputSource inStream = new org.xml.sax.InputSource();
            inStream.setCharacterStream(new java.io.StringReader(Constants.XML_START + sb.toString() + Constants.XML_END));
            Document xmlDoc = docBuilder.parse(inStream);/**/
            // Creamos la organización
            NodeList nodeList = xmlDoc.getFirstChild().getChildNodes();
            LinkedList<ActivitySummary> actList = new LinkedList<ActivitySummary>();
            for(int xmlIndex = 0; xmlIndex < nodeList.getLength(); xmlIndex++)
                actList.add(buildActivity(nodeList.item(xmlIndex), ""));
            ActivitySummary[] actArr = new ActivitySummary[actList.size()];
            return actList.toArray(actArr);
        }
        catch(Exception ex)
        {
            return null;
        }
    }

    public Advance[] GetAdvances(int activityId)
    {
        DataAccesor accesor = DataAccesor.GetInstance();
        String spName = "ObtenerAvances";
        SQLParameter[] parameters = new SQLParameter[]
        {
            new SQLParameter("idActividad", activityId)
        };
        try
        {
            ResultSet reader = accesor.ExecuteInputSP(spName, parameters);
            LinkedList<Advance> result = new LinkedList<Advance>();
            while(reader.next())
            {
                int id = reader.getInt("IdAvanceProyecto");
                Date date = reader.getDate("FechaRegistroAvance");
                double spent = reader.getDouble("MontoGastadoDolares");
                double advancePorc = reader.getDouble("PorcentajeAvanzado");
                Advance advance = new Advance(id, advancePorc, spent, date);
                result.add(advance);
            }
            reader.close();
            Advance[] resultArray = new Advance[result.size()];
            return result.toArray(resultArray);
        }
        catch(Exception ex)
        {
            return null;
        }
    }

    public Activity GetActivity(int activityId)
    {
        DataAccesor accesor = DataAccesor.GetInstance();
        String spName = "ObtenerActividad";
        SQLParameter[] parameters = new SQLParameter[]
        {
            new SQLParameter("idActividad", activityId)
        };
        try
        {
            ResultSet reader = accesor.ExecuteInputSP(spName, parameters);
            Activity result = null;
            if(reader.next())
            {
                String name = reader.getString("NombreActividadProyecto");
                String parentName = reader.getString("NombrePadre");
                Date estimatedStart = reader.getDate("FechaInicio");
                Date estimatedEnd = reader.getDate("FechaFinal");
                double completed = reader.getDouble("PorcentajeCompletitud");
                int parentId = reader.getInt("IdActividadProyectoPadre");
                String description = reader.getString("DescripcionActividadProyecto");
                Date realStart = reader.getDate("FechaInicioReal");
                Date realEnd = reader.getDate("FechaFinalReal");
                double initialBudget = reader.getDouble("PresupuestoInicialDolares");
                double actualBudget = reader.getDouble("PresupuestoActualDolares");
                double extraSpent = reader.getDouble("GastoAdicionalDolares");
                int evaluation = reader.getInt("Evaluacion");
                String activityStatus = reader.getString("NombreEstadoActividadProyecto");
                Enums.ActivityStatus status = EnumConverter.GetActivityStatusFromString(activityStatus);
                String projectType = reader.getString("TipoProyecto");
                Enums.ProjectType type = EnumConverter.GetProjectTypeFromString(projectType);
                result = new Activity(activityId, name, parentName, estimatedStart, estimatedEnd, actualBudget,
                        completed, parentId, description, realStart, realEnd, initialBudget, extraSpent,
                        evaluation, status).ProjectType(type);
            }
            reader.close();
            return result;
        }
        catch(Exception ex)
        {
            return null;
        }
    }
    // </editor-fold>

}
